package qreasymarket.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import javax.security.auth.login.LoginException;
import javax.servlet.jsp.tagext.TryCatchFinally;

import qreasymarket.excepcion.DAOExcepcion;
import qreasymarket.excepcion.LoginExcepcion;
import qreasymarket.modelo.Cliente;
import qreasymarket.modelo.Producto;
import qreasymarket.util.ConexionBD;

public class ProductoDAO extends BaseDAO {

	public Producto obtener(int IdProducto) throws DAOExcepcion {
		Producto vo = new Producto();

		String query = "select producto.id_producto, producto.nombre_producto, marca.nombre_marca,categoria_tc.nombre_categoria,producto.precio,producto.unidad,producto.fecha_vencimiento,producto.promocion_producto,producto.descuento_producto from producto INNER JOIN marca ON marca.id_marca=producto.id_marca JOIN categoria_tc ON producto.id_categoria_tc=categoria_tc.id_categoria_tc where producto.id_producto=?";

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IdProducto);
			rs = stmt.executeQuery();
			if (rs.next()) {

				vo.setIdProducto(rs.getInt(1));
				vo.setNombreProducto(rs.getString(2));
				vo.setNombreMarca(rs.getString(3));
				vo.setNombreCategoria(rs.getString(4));
				vo.setPrecio(rs.getDouble(5));
				vo.setUnidad(rs.getString(6));
				vo.setFechaVencimiento(rs.getDate(7));
				vo.setPromocionProducto(rs.getString(8));
				vo.setDescuento(rs.getDouble(9));

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Producto actualizar(Producto vo) throws DAOExcepcion {

		String query = "update producto set precio=?,promocion_producto=?,descuento_producto=? where id_producto=?";
		Connection con = null;
		PreparedStatement stmt = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDouble(1, vo.getPrecio());
			stmt.setString(2, vo.getPromocionProducto());
			stmt.setDouble(3, vo.getDescuento());
			stmt.setInt(4, vo.getIdProducto());
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo actualizar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Producto> buscarPorMarca(String NombreM)
			throws DAOExcepcion {

		String query = "select producto.id_producto, producto.nombre_producto, marca.nombre_marca,categoria_tc.nombre_categoria,producto.precio,producto.unidad, producto.fecha_vencimiento,producto.promocion_producto, producto.descuento_producto from producto INNER JOIN marca ON marca.id_marca=producto.id_marca JOIN categoria_tc ON producto.id_categoria_tc=categoria_tc.id_categoria_tc where  marca.nombre_marca like ?";
		Collection<Producto> ListaProductos = new ArrayList<Producto>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setString(1, "%" + NombreM + "%");

			rs = stmt.executeQuery();

			while (rs.next()) {

				Producto vo = new Producto();
				vo.setIdProducto(rs.getInt("id_producto"));
				vo.setNombreProducto(rs.getString("nombre_producto"));
				vo.setNombreMarca(rs.getString("nombre_marca"));
				vo.setNombreCategoria(rs.getString("nombre_categoria"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setUnidad(rs.getString("unidad"));
				vo.setFechaVencimiento(rs.getDate("fecha_vencimiento"));
				vo.setPromocionProducto(rs.getString("promocion_producto"));
				vo.setDescuento(rs.getDouble("descuento_producto"));

				ListaProductos.add(vo);

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(ListaProductos.size());
		return ListaProductos;

	}

	public Collection<Producto> buscarPorNombre(String NombreP)
			throws DAOExcepcion {

		String query = "select producto.id_producto, producto.nombre_producto, marca.nombre_marca,categoria_tc.nombre_categoria,producto.precio,producto.unidad, producto.fecha_vencimiento,producto.promocion_producto, producto.descuento_producto from producto INNER JOIN marca ON marca.id_marca=producto.id_marca JOIN categoria_tc ON producto.id_categoria_tc=categoria_tc.id_categoria_tc where producto.nombre_producto like ?";
		Collection<Producto> ListaProductos = new ArrayList<Producto>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + NombreP + "%");

			rs = stmt.executeQuery();

			while (rs.next()) {

				Producto vo = new Producto();
				vo.setIdProducto(rs.getInt("id_producto"));
				vo.setNombreProducto(rs.getString("nombre_producto"));
				vo.setNombreMarca(rs.getString("nombre_marca"));
				vo.setNombreCategoria(rs.getString("nombre_categoria"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setUnidad(rs.getString("unidad"));
				vo.setFechaVencimiento(rs.getDate("fecha_vencimiento"));
				vo.setPromocionProducto(rs.getString("promocion_producto"));
				vo.setDescuento(rs.getDouble("descuento_producto"));

				ListaProductos.add(vo);

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(ListaProductos.size());
		return ListaProductos;
	}

	public Collection<Producto> BuscarPorQR(String codigoqr)
			throws DAOExcepcion {

		String query = "SELECT id_producto,codigo_qr,nombre_producto,precio,promocion_producto from producto WHERE codigo_qr like ?";

		Collection<Producto> cliente = new ArrayList<Producto>();

		Connection con = null;

		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + codigoqr + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Producto vo = new Producto();
				vo.setIdProducto(rs.getInt("id_producto"));
				vo.setCodigoQr(rs.getString("codigo_qr"));
				vo.setNombreProducto(rs.getString("nombre_producto"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setPromocionProducto(rs.getString("promocion_producto"));

				cliente.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cliente;
	}

}
